<?php


namespace App\Services\Questions\Type;


use App\Models\Question;
use App\Services\Questions\BaseQuestion;
use Illuminate\Http\Request;

class Fill extends BaseQuestion
{
    /**
     * 填空题的store方法
     *
     * @param Request $request
     * @return mixed|void
     */
    public function store(Request $request)
    {
        // 验证规则
        $request->validate($this->validate($request));

        // 增加需要的字段
        $request->offsetSet('user_id', auth('api')->id());

        parent::store($request);
    }

    /**
     * 验证的规则
     *
     * @param $request
     * @return array
     */
    public function validate($request)
    {
        // 删除不需要的字段
        $request->offsetUnset('answer');

        // 获取题干中的 [*], (*)
        $sum = preg_match_all('/(\(.*?\))/', $request->input('content'));
        $dsum = preg_match_all('/(\[.*?])/', $request->input('content'));

        return [
            'content' => ['required', function ($attr, $value, $f) use ($sum, $dsum) {
                if (($sum + $dsum) == 0) {
                    $f('答案输入域不能为空');
                }
            }],
            'pid' => ['sometimes', 'exists:questions,id,type,subsystem'],
            'success_answer' => ['required', function ($attr, $value, $f) use ($sum, $dsum) {
                // 打乱的答案前面的数字
                $str1 = substr($value, (strpos($value, '[') - 1), 1);
                // 顺序答案前面的数字
                $str2 = substr($value, (strpos($value, '(') - 1), 1);

                // 括号前面的数字 不等于 题干中的 [*],(*) 的数量
                if ($sum > $str2 || $dsum > $str1) {
                    $f('正确答案数量不能少于输入域');
                }

                /**
                 * 获取括号内的内容
                 * 顺序答案  3(a,b,c)
                 * 打乱的答案 3[a,b,c]
                 */
                // 打乱的答案
                $data1 = (integer)substr($value, strpos($value, '['), strpos($value, ']'));
                // 顺序答案
                $data2 = (integer)substr($value, strpos($value, '('), strpos($value, ')'));

                if ((integer)$str1 > 0) {
                    if ($str1 < count(explode(',', $data1))) {
                        $f('答案格式不匹配');
                    }
                }
                if ((integer)$str2 > 0) {
                    if ($str2 < count(explode(',', $data2))) {
                        $f('答案格式不匹配');
                    }
                }
            }]
        ];
    }

    /**
     * 填空题的update方法
     *
     * @param Request $request
     * @param Question $question
     * @return mixed|void
     */
    public function update(Request $request, Question $question)
    {
        $request->validate($this->validate($request));

        parent::update($request,$question);
    }
}
